#ifdef SU1
#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

const int N = 1000 + 13;

int n, m, q;
char s[N][N];
li sw[N], nsw[N];
char buf[N];

inline bool read()
{
	if (scanf("%d%d%d", &n, &m, &q) != 3 || (n == 0 && m == 0 && q == 0)) return false;
	forn(i, q)
	{
		assert(scanf("%s%s", buf, s[i]) == 2);
		forn(j, n)
		{
			sw[i] <<= 1;
			nsw[i] <<= 1;
			if (buf[j] == '1') sw[i]++;
			else nsw[i]++;
		}
	}
	return true;
}

inline char getNum (int n)
{
	if (n < 10) return char('0' + n);
	return char('A' + (n - 10));
}

inline void solve()
{
	//forn(i, q) cerr << sw[i] << ' ' << nsw[i] << endl;

	forn(i, m)
	{
		li cur = (1LL << n) - 1;
		char last = '0';
		forn(j, q)
		{
			if (s[j][i] == last) cur &= nsw[j];
			else cur &= sw[j];
			last = s[j][i];
		}
		//if (cur == 0) cerr << i << endl;
		assert(cur != 0);
		if (cur & (cur - 1)) putchar('?');
		else
		{
			forn(j, n) if (cur & (1LL << j))
			{
				putchar(getNum(n - 1 - j));
				break;
			}
		}
	}
	puts("");
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);

	while (read())
		solve();
	
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
